// GeoClipmap_OpenGL.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "Config.h"
#include "GeoClipmapTerrain.h"

//
// global variables
//


//////////////////////////////////////////////////////////////////////////

void OnWindowSize(int x, int y)
{
	glViewport(0, 0, x, y);
}

void OnKeyboard(unsigned char key, int x, int y)
{

}

void OnDisplay()
{

}

int _tmain(int argc, _TCHAR* argv[])
{
	//
	// lib init
	//
	glutInit(&argc, argv);
	// window
	glutInitWindowPosition(0, 0);
	glutInitWindowSize(800, 600);
	// rendering context
	glutInitDisplayMode(GLUT_RGB | GLUT_ALPHA | GLUT_DOUBLE | GLUT_DEPTH);
	glutInitContextVersion(3, 3);
	glutInitContextFlags(GLUT_DEBUG);
	glutInitContextProfile(GLUT_COMPATIBILITY_PROFILE);
	// apr pool
	apr_initialize();
	apr_pool_t *pool = NULL;
	apr_pool_create(&pool, NULL);
	assert(pool);
	if (!pool)
	{
		return -1;
	}
	// FreeImage
	FreeImage_Initialise();

	//
	// init
	//
	// args
	int optChar = 0;
	const char *optArg = NULL;
	apr_getopt_option_t longOpt[] = {
		{"filepath", 'f', 1, "height map file path."},
	};
	apr_getopt_t *opt = NULL;
	apr_getopt_init(&opt, pool, argc, argv);
	while (apr_getopt_long(opt, longOpt, &optChar, &optArg) == APR_SUCCESS)
	{
		switch (optChar)
		{
		case 'f':
			Config::GetSingleton().FilePath = optArg;
			break;
		}
	}

	// terrain
	GeoClipmapTerrain *terrain = new GeoClipmapTerrain();
	//////////////////////////////////////////////////////////////////////////


	glutCreateWindow("GeoClipmap_OpenGL");
	glutDisplayFunc(OnDisplay);
	glutReshapeFunc(OnWindowSize);
	glutKeyboardFunc(OnKeyboard);

	glutMainLoop();

	//
	// fini
	//
	delete terrain;
	//////////////////////////////////////////////////////////////////////////

	//
	// lib fini
	//
	FreeImage_DeInitialise();
	apr_pool_destroy(pool);
	apr_terminate();
	//////////////////////////////////////////////////////////////////////////

	return 0;
}
